Compare commits
38 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
8a92fcdb1e | ||
|
6cd4f0cace | ||
|
43abfa778d | ||
|
c8e0cef94a | ||
|
d47875703f | ||
|
a4e63f0f1a | ||
|
7cc0f645c7 | ||
|
dcb457bb6f | ||
|
11c56b52d3 | ||
|
51b937b31f | ||
|
98930d398c | ||
|
9ec0623f29 | ||
|
7f8a7c1019 | ||
|
2ce642f289 | ||
|
6291b9e86b | ||
|
6d1fc191a8 | ||
|
233f762873 | ||
|
b3f8d37ead | ||
|
f57f59fba9 | ||
|
8a54b39459 | ||
|
eb319b796f | ||
|
3c3575eb49 | ||
|
edc8ec9139 | ||
|
167d6d7ff4 | ||
|
ecd6a3623b | ||
|
31b514c281 | ||
|
5924b2b6d4 | ||
|
a2fea1040d | ||
|
8535291767 | ||
|
faff4f4218 | ||
|
ddd9176502 | ||
|
326e14ddd1 | ||
|
0329cffdaa | ||
|
6df9245376 | ||
|
4df1959b05 | ||
|
1c43a9662a | ||
|
2949c755a2 | ||
|
aefa39daef |
13
.github/FUNDING.yml
vendored
Normal file
13
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# These are supported funding model platforms
|
||||||
|
|
||||||
|
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||||
|
patreon: # Replace with a single Patreon username
|
||||||
|
open_collective: # Replace with a single Open Collective username
|
||||||
|
ko_fi: # Replace with a single Ko-fi username
|
||||||
|
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||||
|
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||||
|
liberapay: # Replace with a single Liberapay username
|
||||||
|
issuehunt: # Replace with a single IssueHunt username
|
||||||
|
otechie: # Replace with a single Otechie username
|
||||||
|
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
|
||||||
|
custom: ['https://www.paypal.me/appleboy46']
|
10
.github/dependabot.yml
vendored
Normal file
10
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: github-actions
|
||||||
|
directory: /
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
- package-ecosystem: gomod
|
||||||
|
directory: /
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
93
.github/workflows/ci.yml
vendored
93
.github/workflows/ci.yml
vendored
@@ -2,12 +2,12 @@ name: scp files
|
|||||||
on: [push]
|
on: [push]
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
build:
|
testing:
|
||||||
name: Build
|
name: test scp action
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: checkout
|
- name: checkout
|
||||||
uses: actions/checkout@v1
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: copy file via ssh password
|
- name: copy file via ssh password
|
||||||
uses: ./
|
uses: ./
|
||||||
@@ -50,3 +50,90 @@ jobs:
|
|||||||
port: ${{ secrets.PORT }}
|
port: ${{ secrets.PORT }}
|
||||||
source: "tests/a.txt,tests/b.txt"
|
source: "tests/a.txt,tests/b.txt"
|
||||||
target: "test"
|
target: "test"
|
||||||
|
|
||||||
|
- name: use insecure cipher
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
host: ${{ secrets.HOST }}
|
||||||
|
username: ${{ secrets.USERNAME }}
|
||||||
|
key: ${{ secrets.SSH2 }}
|
||||||
|
passphrase: ${{ secrets.PASSPHRASE }}
|
||||||
|
port: ${{ secrets.PORT }}
|
||||||
|
source: "tests/a.txt,tests/b.txt"
|
||||||
|
target: "test"
|
||||||
|
use_insecure_cipher: true
|
||||||
|
|
||||||
|
- name: correct key but wrong password
|
||||||
|
uses: appleboy/scp-action@7af00892de6f8397c5c3393cfb3b32ae7f91b94b
|
||||||
|
with:
|
||||||
|
host: ${{ secrets.HOST }}
|
||||||
|
username: ${{ secrets.USERNAME }}
|
||||||
|
key: ${{ secrets.KEY }}
|
||||||
|
password: abcdefg
|
||||||
|
port: ${{ secrets.PORT }}
|
||||||
|
source: "tests/a.txt,tests/b.txt"
|
||||||
|
target: "test"
|
||||||
|
|
||||||
|
- name: correct password but wrong key
|
||||||
|
uses: appleboy/scp-action@7af00892de6f8397c5c3393cfb3b32ae7f91b94b
|
||||||
|
with:
|
||||||
|
host: ${{ secrets.HOST }}
|
||||||
|
username: ${{ secrets.USERNAME }}
|
||||||
|
key: abcdefg
|
||||||
|
password: ${{ secrets.PASSWORD }}
|
||||||
|
port: ${{ secrets.PORT }}
|
||||||
|
source: "tests/a.txt,tests/b.txt"
|
||||||
|
target: "test"
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
name: deploy artifact
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- run: echo hello > world.txt
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: my-artifact
|
||||||
|
path: world.txt
|
||||||
|
|
||||||
|
- uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: my-artifact
|
||||||
|
path: distfiles
|
||||||
|
|
||||||
|
- name: copy file to server
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
host: ${{ secrets.HOST }}
|
||||||
|
username: ${{ secrets.USERNAME }}
|
||||||
|
key: ${{ secrets.KEY }}
|
||||||
|
port: ${{ secrets.PORT }}
|
||||||
|
source: distfiles/*
|
||||||
|
target: test
|
||||||
|
|
||||||
|
changes:
|
||||||
|
name: test changed-files
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Get changed files
|
||||||
|
id: changed-files
|
||||||
|
uses: tj-actions/changed-files@v35
|
||||||
|
with:
|
||||||
|
since_last_remote_commit: true
|
||||||
|
separator: ","
|
||||||
|
|
||||||
|
- name: copy file to server
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
host: ${{ secrets.HOST }}
|
||||||
|
username: ${{ secrets.USERNAME }}
|
||||||
|
key: ${{ secrets.KEY }}
|
||||||
|
port: ${{ secrets.PORT }}
|
||||||
|
source: ${{ steps.changed-files.outputs.all_changed_files }}
|
||||||
|
target: test
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
FROM appleboy/drone-scp:1.5.9-linux-amd64
|
FROM ghcr.io/appleboy/drone-scp:1.6.7
|
||||||
|
|
||||||
ADD entrypoint.sh /entrypoint.sh
|
COPY entrypoint.sh /entrypoint.sh
|
||||||
RUN chmod +x /entrypoint.sh
|
RUN chmod +x /entrypoint.sh
|
||||||
ENTRYPOINT ["/entrypoint.sh"]
|
ENTRYPOINT ["/entrypoint.sh"]
|
||||||
|
172
README.md
172
README.md
@@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
[GitHub Action](https://github.com/features/actions) for copying files and artifacts via SSH.
|
[GitHub Action](https://github.com/features/actions) for copying files and artifacts via SSH.
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
[](https://github.com/appleboy/scp-action/actions)
|
[](https://github.com/appleboy/scp-action/actions)
|
||||||
|
|
||||||
|
**Important**: Only support **Linux** [docker](https://www.docker.com/) container.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
copy files and artifacts via SSH as blow.
|
Copy files and artifacts via SSH:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
name: scp files
|
name: scp files
|
||||||
@@ -33,23 +33,27 @@ jobs:
|
|||||||
|
|
||||||
## Input variables
|
## Input variables
|
||||||
|
|
||||||
see the [action.yml](./action.yml) file for more detail imformation.
|
See the [action.yml](./action.yml) file for more detail information.
|
||||||
|
|
||||||
* host - scp remote host
|
* host - scp remote host
|
||||||
* port - scp remote port, default is `22`
|
* port - scp remote port, default is `22`
|
||||||
* username - scp username
|
* username - scp username
|
||||||
* password - scp password
|
* password - scp password
|
||||||
* passphrase - the passphrase is usually to encrypt the private key
|
* passphrase - the passphrase is usually to encrypt the private key
|
||||||
|
* fingerprint - fingerprint SHA256 of the host public key, default is to skip verification
|
||||||
* timeout - timeout for ssh to remote host, default is `30s`
|
* timeout - timeout for ssh to remote host, default is `30s`
|
||||||
* command_timeout - timeout for scp command, default is `10m`
|
* command_timeout - timeout for scp command, default is `10m`
|
||||||
* key - content of ssh private key. ex raw content of ~/.ssh/id_rsa
|
* key - content of ssh private key. ex raw content of ~/.ssh/id_rsa
|
||||||
* key_path - path of ssh private key
|
* key_path - path of ssh private key
|
||||||
* target - target path on the server
|
* target - target path on the server, must be a directory (**required**)
|
||||||
* source - scp file list
|
* source - scp file list (**required**)
|
||||||
* rm - remove target folder before upload data, default is `false`
|
* rm - remove target folder before upload data, default is `false`
|
||||||
* strip_components - remove the specified number of leading path elements.
|
* strip_components - remove the specified number of leading path elements.
|
||||||
* overwrite - use `--overwrite` flag with tar
|
* overwrite - use `--overwrite` flag with tar, overwrite existing files when extracting
|
||||||
* tar_tmp_path - temporary path for tar file on the dest host
|
* tar_tmp_path - temporary path for tar file on the dest host
|
||||||
|
* tar_exec - path to tar executable on the dest host. default is `tar`
|
||||||
|
* tar_dereference - use `--dereference` flag with tar, follow symlinks; archive and dump the files they point to
|
||||||
|
* use_insecure_cipher - include more ciphers with use_insecure_cipher (see [#15](https://github.com/appleboy/scp-action/issues/15))
|
||||||
|
|
||||||
SSH Proxy Setting:
|
SSH Proxy Setting:
|
||||||
|
|
||||||
@@ -61,10 +65,75 @@ SSH Proxy Setting:
|
|||||||
* proxy_timeout - timeout for ssh to proxy host, default is `30s`
|
* proxy_timeout - timeout for ssh to proxy host, default is `30s`
|
||||||
* proxy_key - content of ssh proxy private key.
|
* proxy_key - content of ssh proxy private key.
|
||||||
* proxy_key_path - path of ssh proxy private key
|
* proxy_key_path - path of ssh proxy private key
|
||||||
|
* proxy_fingerprint - fingerprint SHA256 of the host public key, default is to skip verification
|
||||||
|
* proxy_use_insecure_cipher - include more ciphers with use_insecure_cipher (see [#15](https://github.com/appleboy/scp-action/issues/15))
|
||||||
|
|
||||||
### Example
|
## Setting up a SSH Key
|
||||||
|
|
||||||
Copy file via ssh password
|
Make sure to follow the below steps while creating SSH Keys and using them.
|
||||||
|
The best practice is create the SSH Keys on local machine not remote machine.
|
||||||
|
Login with username specified in Github Secrets. Generate a RSA Key-Pair:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# rsa
|
||||||
|
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
|
||||||
|
|
||||||
|
# ed25519
|
||||||
|
ssh-keygen -t ed25519 -a 200 -C "your_email@example.com"
|
||||||
|
```
|
||||||
|
|
||||||
|
Add newly generated key into Authorized keys. Read more about authorized keys [here](https://www.ssh.com/ssh/authorized_keys/).
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# rsa
|
||||||
|
cat .ssh/id_rsa.pub | ssh b@B 'cat >> .ssh/authorized_keys'
|
||||||
|
|
||||||
|
# d25519
|
||||||
|
cat .ssh/id_ed25519.pub | ssh b@B 'cat >> .ssh/authorized_keys'
|
||||||
|
```
|
||||||
|
|
||||||
|
Copy Private Key content and paste in Github Secrets.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# rsa
|
||||||
|
clip < ~/.ssh/id_rsa
|
||||||
|
|
||||||
|
# ed25519
|
||||||
|
clip < ~/.ssh/id_ed25519
|
||||||
|
```
|
||||||
|
|
||||||
|
See the detail information about [SSH login without password](http://www.linuxproblem.org/art_9.html).
|
||||||
|
|
||||||
|
**A note** from one of our readers: Depending on your version of SSH you might also have to do the following changes:
|
||||||
|
|
||||||
|
* Put the public key in `.ssh/authorized_keys2`
|
||||||
|
* Change the permissions of `.ssh` to 700
|
||||||
|
* Change the permissions of `.ssh/authorized_keys2` to 640
|
||||||
|
|
||||||
|
### If you are using OpenSSH
|
||||||
|
|
||||||
|
If you are currently using OpenSSH and are getting the following error:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh: handshake failed: ssh: unable to authenticate, attempted methods [none publickey]
|
||||||
|
```
|
||||||
|
|
||||||
|
Make sure that your key algorithm of choice is supported.
|
||||||
|
On Ubuntu 20.04 or later you must explicitly allow the use of the ssh-rsa algorithm. Add the following line to your OpenSSH daemon file (which is either `/etc/ssh/sshd_config` or a drop-in file under `/etc/ssh/sshd_config.d/`):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
CASignatureAlgorithms +ssh-rsa
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively, `ed25519` keys are accepted by default in OpenSSH. You could use this instead of rsa if needed:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh-keygen -t ed25519 -a 200 -C "your_email@example.com"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Copy file via a SSH password:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- name: copy file via ssh password
|
- name: copy file via ssh password
|
||||||
@@ -78,7 +147,7 @@ Copy file via ssh password
|
|||||||
target: "test"
|
target: "test"
|
||||||
```
|
```
|
||||||
|
|
||||||
Copy file via ssh key
|
Copy file via a SSH key:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- name: copy file via ssh key
|
- name: copy file via ssh key
|
||||||
@@ -106,7 +175,7 @@ Example configuration for ignore list:
|
|||||||
target: "test"
|
target: "test"
|
||||||
```
|
```
|
||||||
|
|
||||||
Example configuration for multiple server
|
Example configuration for multiple servers:
|
||||||
|
|
||||||
```diff
|
```diff
|
||||||
uses: appleboy/scp-action@master
|
uses: appleboy/scp-action@master
|
||||||
@@ -120,7 +189,54 @@ Example configuration for multiple server
|
|||||||
target: "test"
|
target: "test"
|
||||||
```
|
```
|
||||||
|
|
||||||
remove the specified number of leading path elements
|
Example configuration for exclude custom files:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
uses: appleboy/scp-action@master
|
||||||
|
with:
|
||||||
|
host: "example.com"
|
||||||
|
username: foo
|
||||||
|
password: bar
|
||||||
|
port: 22
|
||||||
|
- source: "tests/*.txt"
|
||||||
|
+ source: "tests/*.txt,!tests/a.txt,!tests/b.txt"
|
||||||
|
target: "test"
|
||||||
|
```
|
||||||
|
|
||||||
|
Upload artifact files to remote server:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
deploy:
|
||||||
|
name: deploy artifact
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- run: echo hello > world.txt
|
||||||
|
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: my-artifact
|
||||||
|
path: world.txt
|
||||||
|
|
||||||
|
- uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: my-artifact
|
||||||
|
path: distfiles
|
||||||
|
|
||||||
|
- name: copy file to server
|
||||||
|
uses: appleboy/scp-action@master
|
||||||
|
with:
|
||||||
|
host: ${{ secrets.HOST }}
|
||||||
|
username: ${{ secrets.USERNAME }}
|
||||||
|
key: ${{ secrets.KEY }}
|
||||||
|
port: ${{ secrets.PORT }}
|
||||||
|
source: distfiles/*
|
||||||
|
target: test
|
||||||
|
```
|
||||||
|
|
||||||
|
Remove the specified number of leading path elements:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- name: remove the specified number of leading path elements
|
- name: remove the specified number of leading path elements
|
||||||
@@ -135,7 +251,35 @@ remove the specified number of leading path elements
|
|||||||
strip_components: 1
|
strip_components: 1
|
||||||
```
|
```
|
||||||
|
|
||||||
old target structure:
|
Only copy files that are newer than the corresponding destination files:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
changes:
|
||||||
|
name: test changed-files
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Get changed files
|
||||||
|
id: changed-files
|
||||||
|
uses: tj-actions/changed-files@v35
|
||||||
|
with:
|
||||||
|
since_last_remote_commit: true
|
||||||
|
separator: ","
|
||||||
|
|
||||||
|
- name: copy file to server
|
||||||
|
uses: appleboy/scp-action@master
|
||||||
|
with:
|
||||||
|
host: ${{ secrets.HOST }}
|
||||||
|
username: ${{ secrets.USERNAME }}
|
||||||
|
key: ${{ secrets.KEY }}
|
||||||
|
port: ${{ secrets.PORT }}
|
||||||
|
source: ${{ steps.changed-files.outputs.all_changed_files }}
|
||||||
|
target: test
|
||||||
|
```
|
||||||
|
|
||||||
|
Old target structure:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
foobar
|
foobar
|
||||||
@@ -144,7 +288,7 @@ foobar
|
|||||||
└── b.txt
|
└── b.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
new target structure:
|
New target structure:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
foobar
|
foobar
|
||||||
|
23
action.yml
23
action.yml
@@ -23,21 +23,35 @@ inputs:
|
|||||||
description: 'path of ssh private key'
|
description: 'path of ssh private key'
|
||||||
passphrase:
|
passphrase:
|
||||||
description: 'ssh key passphrase'
|
description: 'ssh key passphrase'
|
||||||
|
fingerprint:
|
||||||
|
description: 'fingerprint SHA256 of the host public key, default is to skip verification'
|
||||||
|
use_insecure_cipher:
|
||||||
|
description: 'include more ciphers with use_insecure_cipher'
|
||||||
|
default: false
|
||||||
target:
|
target:
|
||||||
description: 'target path on the server'
|
description: 'target path on the server, must be a directory path.'
|
||||||
source:
|
source:
|
||||||
description: 'scp file list'
|
description: 'scp file list'
|
||||||
rm:
|
rm:
|
||||||
description: 'remove target folder before upload data'
|
description: 'remove target folder before upload data'
|
||||||
default: false
|
default: false
|
||||||
|
debug:
|
||||||
|
description: 'enable debug message'
|
||||||
|
default: false
|
||||||
strip_components:
|
strip_components:
|
||||||
description: 'remove the specified number of leading path elements'
|
description: 'remove the specified number of leading path elements'
|
||||||
default: 0
|
default: 0
|
||||||
overwrite:
|
overwrite:
|
||||||
description: 'use `--overwrite` flag with tar'
|
description: 'use --overwrite flag with tar'
|
||||||
|
default: false
|
||||||
|
tar_dereference:
|
||||||
|
description: 'use --dereference flag with tar'
|
||||||
default: false
|
default: false
|
||||||
tar_tmp_path:
|
tar_tmp_path:
|
||||||
description: 'temporary path for tar file on the dest host'
|
description: 'temporary path for tar file on the dest host'
|
||||||
|
tar_exec:
|
||||||
|
description: 'temporary path for tar file on the dest host'
|
||||||
|
default: 'tar'
|
||||||
proxy_host:
|
proxy_host:
|
||||||
description: 'ssh proxy remote host'
|
description: 'ssh proxy remote host'
|
||||||
proxy_port:
|
proxy_port:
|
||||||
@@ -56,6 +70,11 @@ inputs:
|
|||||||
description: 'content of ssh proxy private key. ex raw content of ~/.ssh/id_rsa'
|
description: 'content of ssh proxy private key. ex raw content of ~/.ssh/id_rsa'
|
||||||
proxy_key_path:
|
proxy_key_path:
|
||||||
description: 'path of ssh proxy private key'
|
description: 'path of ssh proxy private key'
|
||||||
|
proxy_fingerprint:
|
||||||
|
description: 'fingerprint SHA256 of the host public key, default is to skip verification'
|
||||||
|
proxy_use_insecure_cipher:
|
||||||
|
description: 'include more ciphers with use_insecure_cipher'
|
||||||
|
default: false
|
||||||
runs:
|
runs:
|
||||||
using: 'docker'
|
using: 'docker'
|
||||||
image: 'Dockerfile'
|
image: 'Dockerfile'
|
||||||
|
@@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
export GITHUB="true"
|
|
||||||
|
|
||||||
[ -n "$INPUT_STRIP_COMPONENTS" ] && export INPUT_STRIP_COMPONENTS=$((INPUT_STRIP_COMPONENTS + 0))
|
[ -n "$INPUT_STRIP_COMPONENTS" ] && export INPUT_STRIP_COMPONENTS=$((INPUT_STRIP_COMPONENTS + 0))
|
||||||
|
|
||||||
sh -c "/bin/drone-scp $*"
|
sh -c "/bin/drone-scp $*"
|
||||||
|
@@ -1 +1,2 @@
|
|||||||
foo
|
foo
|
||||||
|
foobar
|
||||||
|
@@ -1 +1,2 @@
|
|||||||
bar
|
bar
|
||||||
|
foobar
|
||||||
|
@@ -1 +1,3 @@
|
|||||||
c
|
c
|
||||||
|
foobar
|
||||||
|
test1234
|
||||||
|
@@ -1 +1,3 @@
|
|||||||
d
|
d
|
||||||
|
foobar
|
||||||
|
foobar
|
||||||
|
Reference in New Issue
Block a user