]>
Commit | Line | Data |
---|---|---|
c64c444d KK |
1 | From 4e63dcc86cc77ec86a8d35ff752603a4b44d44a7 Mon Sep 17 00:00:00 2001 |
2 | From: "Kyle J. McKay" <mackyle@gmail.com> | |
3 | Date: Sat, 6 Jul 2013 21:20:48 -0700 | |
4 | Subject: [PATCH 1/2] Git.pm: add new temp_is_locked function | |
5 | ||
6 | The temp_is_locked function can be used to determine whether | |
7 | or not a given name previously passed to temp_acquire is | |
8 | currently locked. | |
9 | ||
10 | Signed-off-by: Kyle J. McKay <mackyle@gmail.com> | |
11 | Signed-off-by: Junio C Hamano <gitster@pobox.com> | |
12 | --- | |
13 | perl/Git.pm | 33 +++++++++++++++++++++++++++++++-- | |
14 | 1 file changed, 31 insertions(+), 2 deletions(-) | |
15 | ||
16 | diff --git a/perl/Git.pm b/perl/Git.pm | |
17 | index 7a252ef..0ba15b9 100644 | |
18 | --- a/perl/Git.pm | |
19 | +++ b/perl/Git.pm | |
20 | @@ -61,7 +61,7 @@ require Exporter; | |
21 | remote_refs prompt | |
22 | get_tz_offset | |
23 | credential credential_read credential_write | |
24 | - temp_acquire temp_release temp_reset temp_path); | |
25 | + temp_acquire temp_is_locked temp_release temp_reset temp_path); | |
26 | ||
27 | ||
28 | =head1 DESCRIPTION | |
29 | @@ -1206,6 +1206,35 @@ sub temp_acquire { | |
30 | $temp_fd; | |
31 | } | |
32 | ||
33 | +=item temp_is_locked ( NAME ) | |
34 | + | |
35 | +Returns true if the internal lock created by a previous C<temp_acquire()> | |
36 | +call with C<NAME> is still in effect. | |
37 | + | |
38 | +When temp_acquire is called on a C<NAME>, it internally locks the temporary | |
39 | +file mapped to C<NAME>. That lock will not be released until C<temp_release()> | |
40 | +is called with either the original C<NAME> or the L<File::Handle> that was | |
41 | +returned from the original call to temp_acquire. | |
42 | + | |
43 | +Subsequent attempts to call C<temp_acquire()> with the same C<NAME> will fail | |
44 | +unless there has been an intervening C<temp_release()> call for that C<NAME> | |
45 | +(or its corresponding L<File::Handle> that was returned by the original | |
46 | +C<temp_acquire()> call). | |
47 | + | |
48 | +If true is returned by C<temp_is_locked()> for a C<NAME>, an attempt to | |
49 | +C<temp_acquire()> the same C<NAME> will cause an error unless | |
50 | +C<temp_release> is first called on that C<NAME> (or its corresponding | |
51 | +L<File::Handle> that was returned by the original C<temp_acquire()> call). | |
52 | + | |
53 | +=cut | |
54 | + | |
55 | +sub temp_is_locked { | |
56 | + my ($self, $name) = _maybe_self(@_); | |
57 | + my $temp_fd = \$TEMP_FILEMAP{$name}; | |
58 | + | |
59 | + defined $$temp_fd && $$temp_fd->opened && $TEMP_FILES{$$temp_fd}{locked}; | |
60 | +} | |
61 | + | |
62 | =item temp_release ( NAME ) | |
63 | ||
64 | =item temp_release ( FILEHANDLE ) | |
c64c444d KK |
65 | -- |
66 | 1.8.3.2 | |
67 | ||
68 | ||
69 | From 8ac251b66b952b0eddfa4e5bbf08a3c0ae7dbc0b Mon Sep 17 00:00:00 2001 | |
70 | From: "Kyle J. McKay" <mackyle@gmail.com> | |
71 | Date: Sat, 6 Jul 2013 21:20:49 -0700 | |
72 | Subject: [PATCH 2/2] git-svn: allow git-svn fetching to work using serf | |
73 | ||
74 | When attempting to git-svn fetch files from an svn https?: url using | |
75 | the serf library (the only choice starting with svn 1.8) the following | |
76 | errors can occur: | |
77 | ||
78 | Temp file with moniker 'svn_delta' already in use at Git.pm line 1250 | |
79 | Temp file with moniker 'git_blob' already in use at Git.pm line 1250 | |
80 | ||
81 | David Rothenberger <daveroth@acm.org> has determined the cause to | |
82 | be that ra_serf does not drive the delta editor in a depth-first | |
83 | manner [...]. Instead, the calls come in this order: | |
84 | ||
85 | 1. open_root | |
86 | 2. open_directory | |
87 | 3. add_file | |
88 | 4. apply_textdelta | |
89 | 5. add_file | |
90 | 6. apply_textdelta | |
91 | ||
92 | When using the ra_serf access method, git-svn can end up needing | |
93 | to create several temp files before the first one is closed. | |
94 | ||
95 | This change causes a new temp file moniker to be generated if the | |
96 | one that would otherwise have been used is currently locked. | |
97 | ||
98 | Signed-off-by: Kyle J. McKay <mackyle@gmail.com> | |
99 | Signed-off-by: Junio C Hamano <gitster@pobox.com> | |
100 | --- | |
101 | perl/Git/SVN/Fetcher.pm | 6 ++++-- | |
102 | 1 file changed, 4 insertions(+), 2 deletions(-) | |
103 | ||
104 | diff --git a/perl/Git/SVN/Fetcher.pm b/perl/Git/SVN/Fetcher.pm | |
105 | index bd17418..10edb27 100644 | |
106 | --- a/perl/Git/SVN/Fetcher.pm | |
107 | +++ b/perl/Git/SVN/Fetcher.pm | |
108 | @@ -315,11 +315,13 @@ sub change_file_prop { | |
109 | sub apply_textdelta { | |
110 | my ($self, $fb, $exp) = @_; | |
111 | return undef if $self->is_path_ignored($fb->{path}); | |
112 | - my $fh = $::_repository->temp_acquire('svn_delta'); | |
113 | + my $suffix = 0; | |
114 | + ++$suffix while $::_repository->temp_is_locked("svn_delta_${$}_$suffix"); | |
115 | + my $fh = $::_repository->temp_acquire("svn_delta_${$}_$suffix"); | |
116 | # $fh gets auto-closed() by SVN::TxDelta::apply(), | |
117 | # (but $base does not,) so dup() it for reading in close_file | |
118 | open my $dup, '<&', $fh or croak $!; | |
119 | - my $base = $::_repository->temp_acquire('git_blob'); | |
120 | + my $base = $::_repository->temp_acquire("git_blob_${$}_$suffix"); | |
121 | ||
122 | if ($fb->{blob}) { | |
123 | my ($base_is_link, $size); | |
124 | -- | |
125 | 1.8.3.2 | |
126 |