From 05518a8e740a1bcad8d494d2cc018ddbaba52278 Mon Sep 17 00:00:00 2001 From: Marc <7050295+marcleblanc2@users.noreply.github.com> Date: Sun, 18 Feb 2024 14:55:33 +0300 Subject: [PATCH] Refactoring directory layout, resetting ports to default (#13) * Refactor directory layout * Giving up on changing default port 443 to 80, sticking with default --- .gitignore | 12 +- README.md | 37 ++-- bridge-host-ubuntu/docker-compose.yaml | 26 --- .../config/example-config.yaml | 1 - .../config/example-service-account-key.json | 1 - bridge-host-windows/docker-compose.yaml | 26 --- bridge-repo-converter/README.md | 15 -- bridge-repo-converter/build/compose.yaml | 18 -- bridge-repo-converter/docker-compose.yaml | 19 -- .../example-cloud-agent-config.yaml | 0 ...ample-cloud-agent-service-account-key.json | 0 .../example-repos-to-convert.yaml | 0 .../test-repos-to-convert.yaml | 0 .../config => config}/toprc | 0 host-ubuntu/docker-compose.yaml | 27 +++ host-wsl2-ubuntu/docker-compose.yaml | 27 +++ .../wsl2-startup.sh | 0 .../build/.dockerignore | 0 .../build/Dockerfile | 0 repo-converter/build/docker-compose.yaml | 15 ++ .../build/requirements.txt | 0 .../build/run.py | 3 +- repo-converter/docker-compose.yaml | 14 ++ repo-stats-svn/repos.txt | 204 ------------------ .../get-svn-repo-stats.sh | 0 25 files changed, 111 insertions(+), 334 deletions(-) delete mode 100644 bridge-host-ubuntu/docker-compose.yaml delete mode 100644 bridge-host-windows/config/example-config.yaml delete mode 100644 bridge-host-windows/config/example-service-account-key.json delete mode 100644 bridge-host-windows/docker-compose.yaml delete mode 100644 bridge-repo-converter/README.md delete mode 100644 bridge-repo-converter/build/compose.yaml delete mode 100644 bridge-repo-converter/docker-compose.yaml rename bridge-host-ubuntu/config/example-config.yaml => config/example-cloud-agent-config.yaml (100%) rename bridge-host-ubuntu/config/example-service-account-key.json => config/example-cloud-agent-service-account-key.json (100%) rename {bridge-repo-converter/config => config}/example-repos-to-convert.yaml (100%) rename bridge-repo-converter/config/repos-to-convert.yaml => config/test-repos-to-convert.yaml (100%) rename {bridge-repo-converter/config => config}/toprc (100%) create mode 100644 host-ubuntu/docker-compose.yaml create mode 100644 host-wsl2-ubuntu/docker-compose.yaml rename {bridge-host-windows => host-wsl2-ubuntu}/wsl2-startup.sh (100%) rename {bridge-repo-converter => repo-converter}/build/.dockerignore (100%) rename {bridge-repo-converter => repo-converter}/build/Dockerfile (100%) create mode 100644 repo-converter/build/docker-compose.yaml rename {bridge-repo-converter => repo-converter}/build/requirements.txt (100%) rename {bridge-repo-converter => repo-converter}/build/run.py (99%) create mode 100644 repo-converter/docker-compose.yaml delete mode 100644 repo-stats-svn/repos.txt rename repo-stats-svn/get-repo-stats-svn.sh => svn-repo-stats/get-svn-repo-stats.sh (100%) diff --git a/.gitignore b/.gitignore index c460c8b..6e028ef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,13 @@ # Sourcegraph -bridge-repo-converter/repos-to-serve +config/cloud-agent-config.yaml +config/cloud-agent-service-account-key.json config/config.yaml config/service-account-key.json -docker-template/ -repo-stats-svn/*.csv -repo-stats-svn/repos.txt -repo-stats-svn/tmp-repo-metadata/ +config/repos-to-convert.yaml +src-serve-root +svn-repo-stats/*.csv +svn-repo-stats/repos.txt +svn-repo-stats/tmp-repo-metadata/ # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/README.md b/README.md index 0e277d0..334a080 100644 --- a/README.md +++ b/README.md @@ -6,35 +6,36 @@ This repo was created for Sourcegraph Implementation Engineering deployments, an ## Why Running src serve-git and the agent together on the same Docker network allows the agent to use Docker's DNS to reach src serve-git, and prevents src serve-git's unauthenticated HTTP endpoint from needing to be opened outside of the Docker host. -Docker compose also allows for easier upgrades, troubleshooting, monitoring, logging, flexibility of hosting, etc. +Docker compose also allows for easier upgrades, troubleshooting, monitoring, logging, flexibility of hosting, etc. than running the binaries directly on the OS. ## Setup - Sourcegraph Staff Only -1. Add the entry to the sourcegraphConnect targetGroups list in the Cloud instance's config.yaml, get your PR approved and merged +1. Add the needed entries to the sourcegraphConnect targetGroups list in the Cloud instance's config.yaml, get your PR approved and merged ```yaml - dnsName: src-serve-git-ubuntu.local listeningAddress: 100.100.100.0 name: src-serve-git-ubuntu-local ports: - - 80 + - 443 - dnsName: src-serve-git-wsl.local listeningAddress: 100.100.100.1 name: src-serve-git-wsl-local ports: - - 80 + - 443 ``` -2. Clone this repo to a customer's bridge VM, install Docker and Docker's Compose plugin -3. Copy the config.yaml and service-account-key.json files from the Cloud Ops dashboard, and paste them in the files under the config directory -4. Modify the config.yaml copied from the Cloud Ops dashboard - - `serviceAccountKeyFile: /service-account-key.json` so that the Go binary inside the running Docker container finds this file in the path that's mapped via the docker-compose.yaml file - - Only include the `- dialAddress` entries that this cloud agent can reach, remove the others, so the Cloud instance doesn't try connecting to this instance for code hosts it can't reach - - Correct open ports from default 443 to 80 - - Careful when pasting the config.yaml into Windows, because it may add weird line endings or extra spaces, which breaks YAML, as a whitespace-dependent format -5. Clone the customer's repos into the `repos-to-serve` directory at the root of this repo on the bridge VM, or update the volume mount path for the src-serve-git service in the docker-compose.yaml file -6. docker compose up -d -7. Add a Code Host config to the customer's instance +2. Run the Reload frontend GitHub Action, as this seems to be needed for the frontend pods to start using tunnel connections +3. Clone this repo to a customer's bridge VM, install Docker and Docker's Compose plugin +4. Copy the `config.yaml` and `service-account-key.json` files using the instructions on the instance's Cloud Ops dashboard + - Paste them into `./config/cloud-agent-config.yaml` and `./config/cloud-agent-service-account-key.json` +5. Modify the `./config/cloud-agent-config.yaml` file + - `serviceAccountKeyFile: /sourcegraph/cloud-agent-service-account-key.json` so that the Go binary inside the agent container finds this file in the path that's mapped via the docker-compose.yaml files + - Only include the `- dialAddress` entries that this cloud agent instance can reach, remove the others, so the Cloud instance doesn't try using this agent instance for code hosts it can't reach + - Use extra caution when pasting the config.yaml in Windows, as it may use Windows' line endings or extra spaces, which breaks YAML, as a whitespace-dependent format +6. Clone the customer's repos into the `repos-to-serve` directory at the root of this repo on the bridge VM, or update the volume mount path for the src-serve-git service in the docker-compose.yaml file +7. Run `docker compose up -d` +8. Add a Code Host config to the customer's Cloud instance - Type: src serve-git - - URL: "http://src-serve-git-ubuntu.local:80" + - URL: "http://src-serve-git-ubuntu.local:443" - or - - URL: "http://src-serve-git-wsl.local:80" - - Note that the :80 port is required, as this seems to default to port 443, even when used with http:// -8. Use the bridge-repo-converter to convert SVN, TFVC, or Git repos, to Git format, which will store them in the `repos-to-serve` directory, or use any other means at your disposal to get the repos into the /`repos-to-serve` directory + - URL: "http://src-serve-git-wsl.local:443" + - Note that the :443 port may be required, as this seems to default to port 443, even when used with http:// +9. Use the repo-converter to convert SVN, TFVC, or Git repos, to Git format, which will store them in the `repos-to-serve` directory, or use any other means to get the repos into the directory diff --git a/bridge-host-ubuntu/docker-compose.yaml b/bridge-host-ubuntu/docker-compose.yaml deleted file mode 100644 index ca0645a..0000000 --- a/bridge-host-ubuntu/docker-compose.yaml +++ /dev/null @@ -1,26 +0,0 @@ -version: '2.4' - -services: - - cloud-agent: - container_name: cloud-agent - image: index.docker.io/sourcegraph/src-tunnel-agent:2024-02-05-22-28-333320ee - volumes: - - ./config/service-account-key.json:/service-account-key.json - - ./config/config.yaml:/config.yaml - command: ["-config=/config.yaml"] - restart: always - networks: - - sourcegraph - - src-serve-git: - container_name: src-serve-git-ubuntu.local - image: index.docker.io/sourcegraph/src-cli:latest - volumes: - - ../repos-to-serve/:/repos-to-serve:ro - command: "serve-git -addr :80 /repos-to-serve" - networks: - - sourcegraph - -networks: - sourcegraph: diff --git a/bridge-host-windows/config/example-config.yaml b/bridge-host-windows/config/example-config.yaml deleted file mode 100644 index 05383fa..0000000 --- a/bridge-host-windows/config/example-config.yaml +++ /dev/null @@ -1 +0,0 @@ -# Paste the config.yaml contents from the Cloud Ops dashboard here \ No newline at end of file diff --git a/bridge-host-windows/config/example-service-account-key.json b/bridge-host-windows/config/example-service-account-key.json deleted file mode 100644 index 2c73b4b..0000000 --- a/bridge-host-windows/config/example-service-account-key.json +++ /dev/null @@ -1 +0,0 @@ -// Paste the config.yaml contents from the Cloud Ops dashboard here \ No newline at end of file diff --git a/bridge-host-windows/docker-compose.yaml b/bridge-host-windows/docker-compose.yaml deleted file mode 100644 index f01fd13..0000000 --- a/bridge-host-windows/docker-compose.yaml +++ /dev/null @@ -1,26 +0,0 @@ -version: '2.4' - -services: - - cloud-agent: - container_name: cloud-agent - image: index.docker.io/sourcegraph/src-tunnel-agent:2024-02-05-22-28-333320ee - volumes: - - ./config/service-account-key.json:/service-account-key.json - - ./config/config.yaml:/config.yaml - command: ["-config=/config.yaml"] - restart: always - networks: - - sourcegraph - - src-serve-git: - container_name: src-serve-git-wsl.local - image: index.docker.io/sourcegraph/src-cli:latest - volumes: - - ../repos-to-serve/:/repos-to-serve:ro - command: "serve-git -addr :80 /repos-to-serve" - networks: - - sourcegraph - -networks: - sourcegraph: diff --git a/bridge-repo-converter/README.md b/bridge-repo-converter/README.md deleted file mode 100644 index 7056176..0000000 --- a/bridge-repo-converter/README.md +++ /dev/null @@ -1,15 +0,0 @@ -### Building and running your application - -When you're ready, start your application by running: -`docker compose up --build`. - -### Deploying your application to the cloud - -First, build your image, e.g.: `docker build -t myapp .`. - -If your cloud uses a different CPU architecture than your development -machine (e.g., you are on a Mac M1 and your cloud provider is amd64), -you'll want to build the image for that platform, e.g.: -`docker build --platform=linux/amd64 -t myapp .`. - -Then, push it to your registry, e.g. `docker push myregistry.com/myapp`. diff --git a/bridge-repo-converter/build/compose.yaml b/bridge-repo-converter/build/compose.yaml deleted file mode 100644 index 5c80f06..0000000 --- a/bridge-repo-converter/build/compose.yaml +++ /dev/null @@ -1,18 +0,0 @@ -services: - - repo-conversion-bridge: - build: - context: . - container_name: repo-conversion-bridge - volumes: - - ../config/repos-to-convert.yaml:/sourcegraph/repos-to-convert.yaml:ro - - ../config/toprc:/root/.config/procps/toprc - - ../../repos-to-serve/:/repos-to-serve - environment: - - BRIDGE_REPO_CONVERTER_INTERVAL_SECONDS=10 - - LOG_LEVEL=DEBUG # DEBUG INFO WARNING ERROR CRITICAL # Default is INFO - networks: - - sourcegraph - -networks: - sourcegraph: diff --git a/bridge-repo-converter/docker-compose.yaml b/bridge-repo-converter/docker-compose.yaml deleted file mode 100644 index bd3221a..0000000 --- a/bridge-repo-converter/docker-compose.yaml +++ /dev/null @@ -1,19 +0,0 @@ -version: '2.4' - -services: - - bridge-repo-converter: - container_name: bridge-repo-converter - image: ghcr.io/sourcegraph/bridge-repo-converter:latest - volumes: - - ./config/repos-to-convert.yaml:/sourcegraph/repos-to-convert.yaml:ro - - ../repos-to-serve/:/repos-to-serve - restart: always - networks: - - sourcegraph - environment: - - BRIDGE_REPO_CONVERTER_INTERVAL_SECONDS=3600 - - LOG_LEVEL=INFO # DEBUG INFO WARNING ERROR CRITICAL # Default is INFO - -networks: - sourcegraph: diff --git a/bridge-host-ubuntu/config/example-config.yaml b/config/example-cloud-agent-config.yaml similarity index 100% rename from bridge-host-ubuntu/config/example-config.yaml rename to config/example-cloud-agent-config.yaml diff --git a/bridge-host-ubuntu/config/example-service-account-key.json b/config/example-cloud-agent-service-account-key.json similarity index 100% rename from bridge-host-ubuntu/config/example-service-account-key.json rename to config/example-cloud-agent-service-account-key.json diff --git a/bridge-repo-converter/config/example-repos-to-convert.yaml b/config/example-repos-to-convert.yaml similarity index 100% rename from bridge-repo-converter/config/example-repos-to-convert.yaml rename to config/example-repos-to-convert.yaml diff --git a/bridge-repo-converter/config/repos-to-convert.yaml b/config/test-repos-to-convert.yaml similarity index 100% rename from bridge-repo-converter/config/repos-to-convert.yaml rename to config/test-repos-to-convert.yaml diff --git a/bridge-repo-converter/config/toprc b/config/toprc similarity index 100% rename from bridge-repo-converter/config/toprc rename to config/toprc diff --git a/host-ubuntu/docker-compose.yaml b/host-ubuntu/docker-compose.yaml new file mode 100644 index 0000000..c6b0bbb --- /dev/null +++ b/host-ubuntu/docker-compose.yaml @@ -0,0 +1,27 @@ +version: '2.4' + +services: + + cloud-agent: + container_name: cloud-agent + image: index.docker.io/sourcegraph/src-tunnel-agent:2024-02-05-22-28-333320ee + volumes: + - ../config/cloud-agent-service-account-key.json:/sourcegraph/cloud-agent-service-account-key.json:ro + - ../config/cloud-agent-config.yaml:/sourcegraph/cloud-agent-config.yaml:ro + command: ["-config=/sourcegraph/cloud-agent-config.yaml"] + restart: always + networks: + - sourcegraph + + src-serve-git: + # Uses a valid hostname as container_name, to trick the cloud agent and code host config into finding this container on the Docker network + container_name: src-serve-git-ubuntu.local + image: index.docker.io/sourcegraph/src-cli:latest + volumes: + - ../src-serve-root/:/sourcegraph/src-serve-root:ro + command: "serve-git -addr :443 /sourcegraph/src-serve-root" + networks: + - sourcegraph + +networks: + sourcegraph: diff --git a/host-wsl2-ubuntu/docker-compose.yaml b/host-wsl2-ubuntu/docker-compose.yaml new file mode 100644 index 0000000..823abb4 --- /dev/null +++ b/host-wsl2-ubuntu/docker-compose.yaml @@ -0,0 +1,27 @@ +version: '2.4' + +services: + + cloud-agent: + container_name: cloud-agent + image: index.docker.io/sourcegraph/src-tunnel-agent:2024-02-05-22-28-333320ee + volumes: + - ../config/cloud-agent-service-account-key.json:/sourcegraph/cloud-agent-service-account-key.json:ro + - ../config/cloud-agent-config.yaml:/sourcegraph/cloud-agent-config.yaml:ro + command: ["-config=/sourcegraph/cloud-agent-config.yaml"] + restart: always + networks: + - sourcegraph + + src-serve-git: + # Uses a valid hostname as container_name, to trick the cloud agent and code host config into finding this container on the Docker network + container_name: src-serve-git-wsl.local + image: index.docker.io/sourcegraph/src-cli:latest + volumes: + - ../src-serve-root/:/sourcegraph/src-serve-root:ro + command: "serve-git -addr :443 /sourcegraph/src-serve-root" + networks: + - sourcegraph + +networks: + sourcegraph: diff --git a/bridge-host-windows/wsl2-startup.sh b/host-wsl2-ubuntu/wsl2-startup.sh similarity index 100% rename from bridge-host-windows/wsl2-startup.sh rename to host-wsl2-ubuntu/wsl2-startup.sh diff --git a/bridge-repo-converter/build/.dockerignore b/repo-converter/build/.dockerignore similarity index 100% rename from bridge-repo-converter/build/.dockerignore rename to repo-converter/build/.dockerignore diff --git a/bridge-repo-converter/build/Dockerfile b/repo-converter/build/Dockerfile similarity index 100% rename from bridge-repo-converter/build/Dockerfile rename to repo-converter/build/Dockerfile diff --git a/repo-converter/build/docker-compose.yaml b/repo-converter/build/docker-compose.yaml new file mode 100644 index 0000000..64d35a5 --- /dev/null +++ b/repo-converter/build/docker-compose.yaml @@ -0,0 +1,15 @@ +version: '2.4' + +services: + + repo-converter: + container_name: repo-converter + build: + context: . + volumes: + - ../../config/repos-to-convert.yaml:/sourcegraph/repos-to-convert.yaml:ro + - ../../config/toprc:/root/.config/procps/toprc + - ../../src-serve-root/:/sourcegraph/src-serve-root + environment: + - BRIDGE_REPO_CONVERTER_INTERVAL_SECONDS=10 + - LOG_LEVEL=DEBUG # DEBUG INFO WARNING ERROR CRITICAL # Default is INFO diff --git a/bridge-repo-converter/build/requirements.txt b/repo-converter/build/requirements.txt similarity index 100% rename from bridge-repo-converter/build/requirements.txt rename to repo-converter/build/requirements.txt diff --git a/bridge-repo-converter/build/run.py b/repo-converter/build/run.py similarity index 99% rename from bridge-repo-converter/build/run.py rename to repo-converter/build/run.py index 796d1f6..c259487 100644 --- a/bridge-repo-converter/build/run.py +++ b/repo-converter/build/run.py @@ -76,6 +76,7 @@ import sys # https://docs.python.org/3/library/sys.html import time # https://docs.python.org/3/library/time.html # Third party libraries +# psutil requires adding gcc to the Docker image build, which adds about 4 minutes to the build time import psutil # https://pypi.org/project/psutil/ import yaml # https://pyyaml.org/wiki/PyYAMLDocumentation @@ -124,7 +125,7 @@ def parse_args(): ) parser.add_argument( "--repo-share-path", - default = "/repos-to-serve", + default = "/sourcegraph/src-serve-root", help = "Root of path to directory to store cloned Git repos", ) parsed = parser.parse_args() diff --git a/repo-converter/docker-compose.yaml b/repo-converter/docker-compose.yaml new file mode 100644 index 0000000..6c045b6 --- /dev/null +++ b/repo-converter/docker-compose.yaml @@ -0,0 +1,14 @@ +version: '2.4' + +services: + + repo-converter: + container_name: repo-converter + image: ghcr.io/sourcegraph/implementation-bridge-repo-converter:insiders + volumes: + - ../config/repos-to-convert.yaml:/sourcegraph/repos-to-convert.yaml:ro + - ../src-serve-root/:/sourcegraph/src-serve-root" + restart: always + environment: + - BRIDGE_REPO_CONVERTER_INTERVAL_SECONDS=3600 + - LOG_LEVEL=INFO # DEBUG INFO WARNING ERROR CRITICAL # Default is INFO diff --git a/repo-stats-svn/repos.txt b/repo-stats-svn/repos.txt deleted file mode 100644 index 4b7021d..0000000 --- a/repo-stats-svn/repos.txt +++ /dev/null @@ -1,204 +0,0 @@ -https://svn.apache.org/repos/asf/ace -https://svn.apache.org/repos/asf/activemq -https://svn.apache.org/repos/asf/airavata -https://svn.apache.org/repos/asf/allura -https://svn.apache.org/repos/asf/ambari -https://svn.apache.org/repos/asf/ant -https://svn.apache.org/repos/asf/any23 -https://svn.apache.org/repos/asf/apr -https://svn.apache.org/repos/asf/archiva -https://svn.apache.org/repos/asf/aries -https://svn.apache.org/repos/asf/attic -https://svn.apache.org/repos/asf/aurora -https://svn.apache.org/repos/asf/avalon -https://svn.apache.org/repos/asf/avro -https://svn.apache.org/repos/asf/axis -https://svn.apache.org/repos/asf/beam -https://svn.apache.org/repos/asf/beehive -https://svn.apache.org/repos/asf/bigtop -https://svn.apache.org/repos/asf/bloodhound -https://svn.apache.org/repos/asf/board -https://svn.apache.org/repos/asf/bookkeeper -https://svn.apache.org/repos/asf/brooklyn -https://svn.apache.org/repos/asf/bugs -https://svn.apache.org/repos/asf/buildr -https://svn.apache.org/repos/asf/bval -https://svn.apache.org/repos/asf/calcite -https://svn.apache.org/repos/asf/camel -https://svn.apache.org/repos/asf/cassandra -https://svn.apache.org/repos/asf/cayenne -https://svn.apache.org/repos/asf/celix -https://svn.apache.org/repos/asf/chemistry -https://svn.apache.org/repos/asf/chukwa -https://svn.apache.org/repos/asf/clerezza -https://svn.apache.org/repos/asf/click -https://svn.apache.org/repos/asf/climate -https://svn.apache.org/repos/asf/cloudstack -https://svn.apache.org/repos/asf/cocoon -https://svn.apache.org/repos/asf/comdev -https://svn.apache.org/repos/asf/commons -https://svn.apache.org/repos/asf/concom -https://svn.apache.org/repos/asf/continuum -https://svn.apache.org/repos/asf/cordova -https://svn.apache.org/repos/asf/couchdb -https://svn.apache.org/repos/asf/creadur -https://svn.apache.org/repos/asf/crunch -https://svn.apache.org/repos/asf/ctakes -https://svn.apache.org/repos/asf/curator -https://svn.apache.org/repos/asf/cxf -https://svn.apache.org/repos/asf/datafu -https://svn.apache.org/repos/asf/db -https://svn.apache.org/repos/asf/deltacloud -https://svn.apache.org/repos/asf/deltaspike -https://svn.apache.org/repos/asf/devicemap -https://svn.apache.org/repos/asf/directmemory -https://svn.apache.org/repos/asf/directory -https://svn.apache.org/repos/asf/drill -https://svn.apache.org/repos/asf/eagle -https://svn.apache.org/repos/asf/empire-db -https://svn.apache.org/repos/asf/esme -https://svn.apache.org/repos/asf/etch -https://svn.apache.org/repos/asf/excalibur -https://svn.apache.org/repos/asf/falcon -https://svn.apache.org/repos/asf/felix -https://svn.apache.org/repos/asf/flex -https://svn.apache.org/repos/asf/flink -https://svn.apache.org/repos/asf/flume -https://svn.apache.org/repos/asf/forrest -https://svn.apache.org/repos/asf/fundraising -https://svn.apache.org/repos/asf/geode -https://svn.apache.org/repos/asf/geronimo -https://svn.apache.org/repos/asf/giraph -https://svn.apache.org/repos/asf/gora -https://svn.apache.org/repos/asf/gump -https://svn.apache.org/repos/asf/hadoop -https://svn.apache.org/repos/asf/hama -https://svn.apache.org/repos/asf/harmony -https://svn.apache.org/repos/asf/hbase -https://svn.apache.org/repos/asf/helix -https://svn.apache.org/repos/asf/hive -https://svn.apache.org/repos/asf/hivemind -https://svn.apache.org/repos/asf/httpcomponents -https://svn.apache.org/repos/asf/httpd -https://svn.apache.org/repos/asf/ibatis -https://svn.apache.org/repos/asf/ignite -https://svn.apache.org/repos/asf/infrastructure -https://svn.apache.org/repos/asf/isis -https://svn.apache.org/repos/asf/jackrabbit -https://svn.apache.org/repos/asf/jakarta -https://svn.apache.org/repos/asf/james -https://svn.apache.org/repos/asf/jclouds -https://svn.apache.org/repos/asf/jena -https://svn.apache.org/repos/asf/jmeter -https://svn.apache.org/repos/asf/johnzon -https://svn.apache.org/repos/asf/jspwiki -https://svn.apache.org/repos/asf/juddi -https://svn.apache.org/repos/asf/kafka -https://svn.apache.org/repos/asf/karaf -https://svn.apache.org/repos/asf/knox -https://svn.apache.org/repos/asf/kylin -https://svn.apache.org/repos/asf/labs -https://svn.apache.org/repos/asf/lens -https://svn.apache.org/repos/asf/lenya -https://svn.apache.org/repos/asf/libcloud -https://svn.apache.org/repos/asf/logging -https://svn.apache.org/repos/asf/lucene -https://svn.apache.org/repos/asf/lucene.net -https://svn.apache.org/repos/asf/lucy -https://svn.apache.org/repos/asf/mahout -https://svn.apache.org/repos/asf/manifoldcf -https://svn.apache.org/repos/asf/marmotta -https://svn.apache.org/repos/asf/maven -https://svn.apache.org/repos/asf/mesos -https://svn.apache.org/repos/asf/metamodel -https://svn.apache.org/repos/asf/mina -https://svn.apache.org/repos/asf/mrunit -https://svn.apache.org/repos/asf/myfaces -https://svn.apache.org/repos/asf/nifi -https://svn.apache.org/repos/asf/nutch -https://svn.apache.org/repos/asf/ode -https://svn.apache.org/repos/asf/ofbiz -https://svn.apache.org/repos/asf/olingo -https://svn.apache.org/repos/asf/oltu -https://svn.apache.org/repos/asf/onami -https://svn.apache.org/repos/asf/oodt -https://svn.apache.org/repos/asf/oozie -https://svn.apache.org/repos/asf/openjpa -https://svn.apache.org/repos/asf/openmeetings -https://svn.apache.org/repos/asf/opennlp -https://svn.apache.org/repos/asf/openoffice -https://svn.apache.org/repos/asf/openwebbeans -https://svn.apache.org/repos/asf/parquet -https://svn.apache.org/repos/asf/pdfbox -https://svn.apache.org/repos/asf/perl -https://svn.apache.org/repos/asf/phoenix -https://svn.apache.org/repos/asf/pig -https://svn.apache.org/repos/asf/pivot -https://svn.apache.org/repos/asf/planet -https://svn.apache.org/repos/asf/poi -https://svn.apache.org/repos/asf/portals -https://svn.apache.org/repos/asf/qpid -https://svn.apache.org/repos/asf/quetzalcoatl -https://svn.apache.org/repos/asf/ranger -https://svn.apache.org/repos/asf/rave -https://svn.apache.org/repos/asf/reef -https://svn.apache.org/repos/asf/river -https://svn.apache.org/repos/asf/roller -https://svn.apache.org/repos/asf/samza -https://svn.apache.org/repos/asf/santuario -https://svn.apache.org/repos/asf/sentry -https://svn.apache.org/repos/asf/serf -https://svn.apache.org/repos/asf/servicemix -https://svn.apache.org/repos/asf/shale -https://svn.apache.org/repos/asf/shindig -https://svn.apache.org/repos/asf/shiro -https://svn.apache.org/repos/asf/singa -https://svn.apache.org/repos/asf/sis -https://svn.apache.org/repos/asf/sling -https://svn.apache.org/repos/asf/spamassassin -https://svn.apache.org/repos/asf/spark -https://svn.apache.org/repos/asf/sqoop -https://svn.apache.org/repos/asf/stanbol -https://svn.apache.org/repos/asf/stdcxx -https://svn.apache.org/repos/asf/steve -https://svn.apache.org/repos/asf/storm -https://svn.apache.org/repos/asf/stratos -https://svn.apache.org/repos/asf/struts -https://svn.apache.org/repos/asf/subversion -https://svn.apache.org/repos/asf/synapse -https://svn.apache.org/repos/asf/syncope -https://svn.apache.org/repos/asf/systemds -https://svn.apache.org/repos/asf/tajo -https://svn.apache.org/repos/asf/tapestry -https://svn.apache.org/repos/asf/tcl -https://svn.apache.org/repos/asf/tez -https://svn.apache.org/repos/asf/thrift -https://svn.apache.org/repos/asf/tika -https://svn.apache.org/repos/asf/tiles -https://svn.apache.org/repos/asf/tinkerpop -https://svn.apache.org/repos/asf/tomcat -https://svn.apache.org/repos/asf/tomee -https://svn.apache.org/repos/asf/trafficserver -https://svn.apache.org/repos/asf/turbine -https://svn.apache.org/repos/asf/tuscany -https://svn.apache.org/repos/asf/twill -https://svn.apache.org/repos/asf/uima -https://svn.apache.org/repos/asf/unomi -https://svn.apache.org/repos/asf/usergrid -https://svn.apache.org/repos/asf/vcl -https://svn.apache.org/repos/asf/velocity -https://svn.apache.org/repos/asf/vxquery -https://svn.apache.org/repos/asf/webservices -https://svn.apache.org/repos/asf/whirr -https://svn.apache.org/repos/asf/wicket -https://svn.apache.org/repos/asf/wink -https://svn.apache.org/repos/asf/wookie -https://svn.apache.org/repos/asf/xalan -https://svn.apache.org/repos/asf/xerces -https://svn.apache.org/repos/asf/xml -https://svn.apache.org/repos/asf/xmlbeans -https://svn.apache.org/repos/asf/xmlgraphics -https://svn.apache.org/repos/asf/zeppelin -https://svn.apache.org/repos/asf/zest -https://svn.apache.org/repos/asf/zookeeper -https://svn.apache.org/repos/asf/incubator diff --git a/repo-stats-svn/get-repo-stats-svn.sh b/svn-repo-stats/get-svn-repo-stats.sh similarity index 100% rename from repo-stats-svn/get-repo-stats-svn.sh rename to svn-repo-stats/get-svn-repo-stats.sh