From b2139dbd72d16e40eddfd5b9ad1314703b39fe65 Mon Sep 17 00:00:00 2001 From: Dirk Hoerner Date: Fri, 14 Aug 2009 08:58:31 +0200 Subject: git-cvsimport: add support for cvs pserver password scrambling. Instead of a cleartext password, the CVS pserver expects a scrambled one in the authentication request. With this patch it is possible to import CVS repositories only accessible via pserver and user/password. Signed-off-by: Dirk Hoerner Signed-off-by: Junio C Hamano --- git-cvsimport.perl | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) (limited to 'git-cvsimport.perl') diff --git a/git-cvsimport.perl b/git-cvsimport.perl index e439202961..593832d813 100755 --- a/git-cvsimport.perl +++ b/git-cvsimport.perl @@ -252,7 +252,8 @@ sub conn { } }; } - $pass="A" unless $pass; + + $pass = $self->_scramble($pass); my ($s, $rep); if ($proxyhost) { @@ -484,6 +485,42 @@ sub _fetchfile { return $res; } +sub _scramble { + my ($self, $pass) = @_; + my $scrambled = "A"; + + return $scrambled unless $pass; + + my $pass_len = length($pass); + my @pass_arr = split("", $pass); + my $i; + + # from cvs/src/scramble.c + my @shifts = ( + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 114,120, 53, 79, 96,109, 72,108, 70, 64, 76, 67,116, 74, 68, 87, + 111, 52, 75,119, 49, 34, 82, 81, 95, 65,112, 86,118,110,122,105, + 41, 57, 83, 43, 46,102, 40, 89, 38,103, 45, 50, 42,123, 91, 35, + 125, 55, 54, 66,124,126, 59, 47, 92, 71,115, 78, 88,107,106, 56, + 36,121,117,104,101,100, 69, 73, 99, 63, 94, 93, 39, 37, 61, 48, + 58,113, 32, 90, 44, 98, 60, 51, 33, 97, 62, 77, 84, 80, 85,223, + 225,216,187,166,229,189,222,188,141,249,148,200,184,136,248,190, + 199,170,181,204,138,232,218,183,255,234,220,247,213,203,226,193, + 174,172,228,252,217,201,131,230,197,211,145,238,161,179,160,212, + 207,221,254,173,202,146,224,151,140,196,205,130,135,133,143,246, + 192,159,244,239,185,168,215,144,139,165,180,157,147,186,214,176, + 227,231,219,169,175,156,206,198,129,164,150,210,154,177,134,127, + 182,128,158,208,162,132,167,209,149,241,153,251,237,236,171,195, + 243,233,253,240,194,250,191,155,142,137,245,235,163,242,178,152 + ); + + for ($i = 0; $i < $pass_len; $i++) { + $scrambled .= pack("C", $shifts[ord($pass_arr[$i])]); + } + + return $scrambled; +} package main; -- cgit v1.2.1 From 3fb9d58235ce4985689840b901aecacc6e3bd094 Mon Sep 17 00:00:00 2001 From: Pascal Obry Date: Fri, 4 Sep 2009 13:58:32 +0200 Subject: Do not scramble password read from .cvspass Passwords stored in .cvspass are already scrambled, we do not want to scramble them twice. Only passwords read from the command line are scrambled. This fixes a regression introduced by b2139db (git-cvsimport: add support for cvs pserver password scrambling., 2009-08-14). Signed-off-by: Pascal Obry Signed-off-by: Junio C Hamano --- git-cvsimport.perl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'git-cvsimport.perl') diff --git a/git-cvsimport.perl b/git-cvsimport.perl index 593832d813..d7411151dd 100755 --- a/git-cvsimport.perl +++ b/git-cvsimport.perl @@ -238,7 +238,9 @@ sub conn { } my $rr = ":pserver:$user\@$serv:$port$repo"; - unless ($pass) { + if ($pass) { + $pass = $self->_scramble($pass); + } else { open(H,$ENV{'HOME'}."/.cvspass") and do { # :pserver:cvs@mea.tmt.tele.fi:/cvsroot/zmailer Ah) { @@ -253,8 +255,6 @@ sub conn { }; } - $pass = $self->_scramble($pass); - my ($s, $rep); if ($proxyhost) { -- cgit v1.2.1 From e481b1d8db9947681a5c124545ef06951f42155d Mon Sep 17 00:00:00 2001 From: Clemens Buchacher Date: Thu, 17 Sep 2009 09:21:02 +0200 Subject: cvs: initialize empty password If we do not read a password from the command line, and there are no passwords stored in .cvspass, we have to initialize the password with just "A". This fixes a regression introduced by 3fb9d582 (Do not scramble password read from .cvspass). Signed-off-by: Clemens Buchacher Signed-off-by: Junio C Hamano --- git-cvsimport.perl | 1 + 1 file changed, 1 insertion(+) (limited to 'git-cvsimport.perl') diff --git a/git-cvsimport.perl b/git-cvsimport.perl index d7411151dd..1ad20ac964 100755 --- a/git-cvsimport.perl +++ b/git-cvsimport.perl @@ -253,6 +253,7 @@ sub conn { } } }; + $pass = "A" unless $pass; } my ($s, $rep); -- cgit v1.2.1 From f6fdbb6804eac72eb0ccff191162a5911bf2b014 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Mon, 19 Oct 2009 02:49:55 -0400 Subject: cvsimport: fix relative argument filenames One of the first things that cvsimport does is chdir to the newly created git repo. This means that any filenames given to us on the command line will be looked up relative to the git repo directory. This is probably not what the user expects, so let's remember and prepend the original directory for relative filenames. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- git-cvsimport.perl | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'git-cvsimport.perl') diff --git a/git-cvsimport.perl b/git-cvsimport.perl index 1ad20ac964..a7d215c8aa 100755 --- a/git-cvsimport.perl +++ b/git-cvsimport.perl @@ -579,10 +579,21 @@ sub get_headref ($) { return $r; } +my $user_filename_prepend = ''; +sub munge_user_filename { + my $name = shift; + return File::Spec->file_name_is_absolute($name) ? + $name : + $user_filename_prepend . $name; +} + -d $git_tree or mkdir($git_tree,0777) or die "Could not create $git_tree: $!"; -chdir($git_tree); +if ($git_tree ne '.') { + $user_filename_prepend = getwd() . '/'; + chdir($git_tree); +} my $last_branch = ""; my $orig_branch = ""; @@ -644,7 +655,7 @@ unless (-d $git_dir) { -f "$git_dir/cvs-authors" and read_author_info("$git_dir/cvs-authors"); if ($opt_A) { - read_author_info($opt_A); + read_author_info(munge_user_filename($opt_A)); write_author_info("$git_dir/cvs-authors"); } @@ -679,7 +690,7 @@ unless ($opt_P) { $? == 0 or die "git-cvsimport: fatal: cvsps reported error\n"; close $cvspsfh; } else { - $cvspsfile = $opt_P; + $cvspsfile = munge_user_filename($opt_P); } open(CVS, "<$cvspsfile") or die $!; -- cgit v1.2.1 From 640d9d08738db4380c2f856d60ac0a2ceb496c2f Mon Sep 17 00:00:00 2001 From: Ben Walton Date: Tue, 19 Jan 2010 14:03:08 -0500 Subject: cvsimport: modernize callouts to git subcommands This patch updates all calling conventions for external git tools. to use the modern calling convention (eg: git foo instead of git-foo). This is almost entierly a s/git-/git / operation, with deviations only as required to keep tests passing. Reported-by: Alexander Maier Signed-off-by: Ben Walton Signed-off-by: Junio C Hamano --- git-cvsimport.perl | 64 +++++++++++++++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) (limited to 'git-cvsimport.perl') diff --git a/git-cvsimport.perl b/git-cvsimport.perl index a7d215c8aa..adffa0c3cd 100755 --- a/git-cvsimport.perl +++ b/git-cvsimport.perl @@ -609,16 +609,16 @@ $orig_git_index = $ENV{GIT_INDEX_FILE} if exists $ENV{GIT_INDEX_FILE}; my %index; # holds filenames of one index per branch unless (-d $git_dir) { - system("git-init"); + system("git init"); die "Cannot init the GIT db at $git_tree: $?\n" if $?; - system("git-read-tree"); + system("git read-tree"); die "Cannot init an empty tree: $?\n" if $?; $last_branch = $opt_o; $orig_branch = ""; } else { - open(F, "git-symbolic-ref HEAD |") or - die "Cannot run git-symbolic-ref: $!\n"; + open(F, "git symbolic-ref HEAD |") or + die "Cannot run git symbolic-ref: $!\n"; chomp ($last_branch = ); $last_branch = basename($last_branch); close(F); @@ -627,12 +627,12 @@ unless (-d $git_dir) { $last_branch = "master"; } $orig_branch = $last_branch; - $tip_at_start = `git-rev-parse --verify HEAD`; + $tip_at_start = `git rev-parse --verify HEAD`; # Get the last import timestamps my $fmt = '($ref, $author) = (%(refname), %(author));'; - open(H, "git-for-each-ref --perl --format='$fmt' $remote |") or - die "Cannot run git-for-each-ref: $!\n"; + open(H, "git for-each-ref --perl --format='$fmt' $remote |") or + die "Cannot run git for-each-ref: $!\n"; while (defined(my $entry = )) { my ($ref, $author); eval($entry) || die "cannot eval refs list: $@"; @@ -687,7 +687,7 @@ unless ($opt_P) { print $cvspsfh $_; } close CVSPS; - $? == 0 or die "git-cvsimport: fatal: cvsps reported error\n"; + $? == 0 or die "git cvsimport: fatal: cvsps reported error\n"; close $cvspsfh; } else { $cvspsfile = munge_user_filename($opt_P); @@ -716,27 +716,27 @@ my $state = 0; sub update_index (\@\@) { my $old = shift; my $new = shift; - open(my $fh, '|-', qw(git-update-index -z --index-info)) - or die "unable to open git-update-index: $!"; + open(my $fh, '|-', qw(git update-index -z --index-info)) + or die "unable to open git update-index: $!"; print $fh (map { "0 0000000000000000000000000000000000000000\t$_\0" } @$old), (map { '100' . sprintf('%o', $_->[0]) . " $_->[1]\t$_->[2]\0" } @$new) - or die "unable to write to git-update-index: $!"; + or die "unable to write to git update-index: $!"; close $fh - or die "unable to write to git-update-index: $!"; - $? and die "git-update-index reported error: $?"; + or die "unable to write to git update-index: $!"; + $? and die "git update-index reported error: $?"; } sub write_tree () { - open(my $fh, '-|', qw(git-write-tree)) - or die "unable to open git-write-tree: $!"; + open(my $fh, '-|', "git write-tree") + or die "unable to open git write-tree: $!"; chomp(my $tree = <$fh>); is_sha1($tree) or die "Cannot get tree id ($tree): $!"; close($fh) - or die "Error running git-write-tree: $?\n"; + or die "Error running git write-tree: $?\n"; print "Tree ID $tree\n" if $opt_v; return $tree; } @@ -751,7 +751,7 @@ sub commit { if ($branch eq $opt_o && !$index{branch} && !get_headref("$remote/$branch")) { # looks like an initial commit - # use the index primed by git-init + # use the index primed by git init $ENV{GIT_INDEX_FILE} = "$git_dir/index"; $index{$branch} = "$git_dir/index"; } else { @@ -761,9 +761,9 @@ sub commit { $index{$branch} = tmpnam(); $ENV{GIT_INDEX_FILE} = $index{$branch}; if ($ancestor) { - system("git-read-tree", "$remote/$ancestor"); + system("git", "read-tree", "$remote/$ancestor"); } else { - system("git-read-tree", "$remote/$branch"); + system("git", "read-tree", "$remote/$branch"); } die "read-tree failed: $?\n" if $?; } @@ -798,7 +798,7 @@ sub commit { $ENV{GIT_COMMITTER_EMAIL} = $author_email; $ENV{GIT_COMMITTER_DATE} = $commit_date; my $pid = open2(my $commit_read, my $commit_write, - 'git-commit-tree', $tree, @commit_args); + 'git', 'commit-tree', $tree, @commit_args); # compatibility with git2cvs substr($logmsg,32767) = "" if length($logmsg) > 32767; @@ -811,7 +811,7 @@ sub commit { } print($commit_write "$logmsg\n") && close($commit_write) - or die "Error writing to git-commit-tree: $!\n"; + or die "Error writing to git commit-tree: $!\n"; print "Committed patch $patchset ($branch $commit_date)\n" if $opt_v; chomp(my $cid = <$commit_read>); @@ -820,9 +820,9 @@ sub commit { close($commit_read); waitpid($pid,0); - die "Error running git-commit-tree: $?\n" if $?; + die "Error running git commit-tree: $?\n" if $?; - system('git-update-ref', "$remote/$branch", $cid) == 0 + system('git' , 'update-ref', "$remote/$branch", $cid) == 0 or die "Cannot write branch $branch for update: $!\n"; if ($tag) { @@ -832,7 +832,7 @@ sub commit { $xtag =~ s/[\/]/$opt_s/g; $xtag =~ s/\[//g; - system('git-tag', '-f', $xtag, $cid) == 0 + system('git' , 'tag', '-f', $xtag, $cid) == 0 or die "Cannot create tag $xtag: $!\n"; print "Created tag '$xtag' on '$branch'\n" if $opt_v; @@ -969,7 +969,7 @@ while () { my $pid = open(my $F, '-|'); die $! unless defined $pid; if (!$pid) { - exec("git-hash-object", "-w", $tmpname) + exec("git", "hash-object", "-w", $tmpname) or die "Cannot create object: $!\n"; } my $sha = <$F>; @@ -1013,7 +1013,7 @@ unless ($opt_P) { # The heuristic of repacking every 1024 commits can leave a # lot of unpacked data. If there is more than 1MB worth of # not-packed objects, repack once more. -my $line = `git-count-objects`; +my $line = `git count-objects`; if ($line =~ /^(\d+) objects, (\d+) kilobytes$/) { my ($n_objects, $kb) = ($1, $2); 1024 < $kb @@ -1038,26 +1038,26 @@ if ($orig_branch) { if ($opt_i) { exit 0; } - my $tip_at_end = `git-rev-parse --verify HEAD`; + my $tip_at_end = `git rev-parse --verify HEAD`; if ($tip_at_start ne $tip_at_end) { for ($tip_at_start, $tip_at_end) { chomp; } print "Fetched into the current branch.\n" if $opt_v; - system(qw(git-read-tree -u -m), + system(qw(git read-tree -u -m), $tip_at_start, $tip_at_end); die "Fast-forward update failed: $?\n" if $?; } else { - system(qw(git-merge cvsimport HEAD), "$remote/$opt_o"); + system(qw(git merge cvsimport HEAD), "$remote/$opt_o"); die "Could not merge $opt_o into the current branch.\n" if $?; } } else { $orig_branch = "master"; print "DONE; creating $orig_branch branch\n" if $opt_v; - system("git-update-ref", "refs/heads/master", "$remote/$opt_o") + system("git", "update-ref", "refs/heads/master", "$remote/$opt_o") unless defined get_headref('refs/heads/master'); - system("git-symbolic-ref", "$remote/HEAD", "$remote/$opt_o") + system("git", "symbolic-ref", "$remote/HEAD", "$remote/$opt_o") if ($opt_r && $opt_o ne 'HEAD'); - system('git-update-ref', 'HEAD', "$orig_branch"); + system('git', 'update-ref', 'HEAD', "$orig_branch"); unless ($opt_i) { system('git checkout -f'); die "checkout failed: $?\n" if $?; -- cgit v1.2.1 From a12477dbe1be24c3948dd7994874d1d1187c40c3 Mon Sep 17 00:00:00 2001 From: Ben Walton Date: Tue, 19 Jan 2010 14:03:09 -0500 Subject: cvsimport: standarize open() calls to external git tools Standardize calls to open() where external git tools are used as part of a pipeline. Instead of open(X, "git foo ... |)", use open(X, "-|", qw(git foo ...)). All calls are made without the use of an 'sh -c' process to split the arguments. Signed-off-by: Ben Walton Signed-off-by: Junio C Hamano --- git-cvsimport.perl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'git-cvsimport.perl') diff --git a/git-cvsimport.perl b/git-cvsimport.perl index adffa0c3cd..e838c2e0cd 100755 --- a/git-cvsimport.perl +++ b/git-cvsimport.perl @@ -617,7 +617,7 @@ unless (-d $git_dir) { $last_branch = $opt_o; $orig_branch = ""; } else { - open(F, "git symbolic-ref HEAD |") or + open(F, "-|", qw(git symbolic-ref HEAD)) or die "Cannot run git symbolic-ref: $!\n"; chomp ($last_branch = ); $last_branch = basename($last_branch); @@ -631,8 +631,8 @@ unless (-d $git_dir) { # Get the last import timestamps my $fmt = '($ref, $author) = (%(refname), %(author));'; - open(H, "git for-each-ref --perl --format='$fmt' $remote |") or - die "Cannot run git for-each-ref: $!\n"; + my @cmd = ('git', 'for-each-ref', '--perl', "--format=$fmt", $remote); + open(H, "-|", @cmd) or die "Cannot run git for-each-ref: $!\n"; while (defined(my $entry = )) { my ($ref, $author); eval($entry) || die "cannot eval refs list: $@"; @@ -730,7 +730,7 @@ sub update_index (\@\@) { } sub write_tree () { - open(my $fh, '-|', "git write-tree") + open(my $fh, '-|', qw(git write-tree)) or die "unable to open git write-tree: $!"; chomp(my $tree = <$fh>); is_sha1($tree) -- cgit v1.2.1 From 91fe7324c5a5a11a7fff4993ce5ded81b6e3ee08 Mon Sep 17 00:00:00 2001 From: Ben Walton Date: Tue, 19 Jan 2010 14:03:10 -0500 Subject: cvsimport: standarize system() calls to external git tools This patch standardizes calls to system() where external git tools are called. Instead of system("git foo ... "), use system(qw(git foo ...)). All calls are made without the use of an 'sh -c' process to split the arguments. Signed-off-by: Ben Walton Signed-off-by: Junio C Hamano --- git-cvsimport.perl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'git-cvsimport.perl') diff --git a/git-cvsimport.perl b/git-cvsimport.perl index e838c2e0cd..4853bf7a0d 100755 --- a/git-cvsimport.perl +++ b/git-cvsimport.perl @@ -609,9 +609,9 @@ $orig_git_index = $ENV{GIT_INDEX_FILE} if exists $ENV{GIT_INDEX_FILE}; my %index; # holds filenames of one index per branch unless (-d $git_dir) { - system("git init"); + system(qw(git init)); die "Cannot init the GIT db at $git_tree: $?\n" if $?; - system("git read-tree"); + system(qw(git read-tree)); die "Cannot init an empty tree: $?\n" if $?; $last_branch = $opt_o; @@ -993,7 +993,7 @@ while () { } commit(); if (($commitcount & 1023) == 0) { - system("git repack -a -d"); + system(qw(git repack -a -d)); } $state = 1; } elsif ($state == 11 and /^-+$/) { @@ -1017,7 +1017,7 @@ my $line = `git count-objects`; if ($line =~ /^(\d+) objects, (\d+) kilobytes$/) { my ($n_objects, $kb) = ($1, $2); 1024 < $kb - and system("git repack -a -d"); + and system(qw(git repack -a -d)); } foreach my $git_index (values %index) { @@ -1059,7 +1059,7 @@ if ($orig_branch) { if ($opt_r && $opt_o ne 'HEAD'); system('git', 'update-ref', 'HEAD', "$orig_branch"); unless ($opt_i) { - system('git checkout -f'); + system(qw(git checkout -f)); die "checkout failed: $?\n" if $?; } } -- cgit v1.2.1