git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] Support different branch layouts in git-p4

From
Tor Arvid Lund <torarvid@gmail.com>
Date
Feb 7, 2011, 23:27 UTC
Message-ID
<AANLkTimGKc4MTwb=AnZ_Bv1EGS7yfgrFupxBOVVSm4s8@mail.gmail.com>
In-Reply-To
<4D4F3738.7010603@vmware.com>
On Mon, Feb 7, 2011 at 1:05 AM, Ian Wienand <ianw@vmware.com> wrote:
Show 7 quoted lines
> On 04/02/11 16:37, Tor Arvid Lund wrote:
>> For starters, I don't think that I like git-p4 being taught to solve
>> problems that seem to be caused by a poor/unfortunate perforce layout.
>
> I do think this //depot/project/branch type layout is pretty typical,
> although I admit I don't have a lot of experience with alternative p4
> setups.

You may be right, although I suspect that //depot/department/project/branch may be equally typical. At my $dayjob, we have gone through several "reorganizations" of the perforce layouts. I'm the guy that never likes any of them ;)

Show 11 quoted lines
>> A solution which I think would work well for everyone, is if files
>> would be placed according to the right-hand patterns in the
>> client-spec.
>
> I did consider this at first.  My only issue is that it is a bit
> confusing to use the client spec for filtering (and in this case
> re-writing), but not for actually selecting the depots to clone, which
> I still need to replicate on the command line.  However that is a much
> larger change.
>
> What do you think of this one?
In general, me thinks me likes it :-)
(and it turned out much smaller than I would have originally guessed)

I should probably mention that I haven't tested your patch at all. I will have a pretty rough week at work, so it would be great if anyone else feels like chiming in on this one... But I have some quick observations below:

Show 64 quoted lines
> ---
>
> diff --git a/contrib/fast-import/git-p4 b/contrib/fast-import/git-p4
> index 04ce7e3..eb9620c 100755
> --- a/contrib/fast-import/git-p4
> +++ b/contrib/fast-import/git-p4
> @@ -878,6 +878,7 @@ class P4Sync(Command):
>         self.cloneExclude = []
>         self.useClientSpec = False
>         self.clientSpecDirs = []
> +        self.clientName = None
>
>         if gitConfig("git-p4.syncFromOrigin") == "false":
>             self.syncWithOrigin = False
> @@ -910,6 +911,22 @@ class P4Sync(Command):
>         return files
>
>     def stripRepoPath(self, path, prefixes):
> +        if self.useClientSpec:
> +
> +            # if using the client spec, we use the output directory
> +            # specified in the client.  For example, a view
> +            #   //depot/foo/branch/... //client/branch/foo/...
> +            # will end up putting all foo/branch files into
> +            #  branch/foo/
> +            for val in self.clientSpecDirs:
> +                if path.startswith(val[0]):
> +                    # replace the depot path with the client path
> +                    path = path.replace(val[0], val[1][1])
> +                    # now strip out the client (//client/...)
> +                    path = re.sub("^(//[^/]+/)", '', path)
> +                    # the rest is all path
> +                    return path
> +
>         if self.keepRepoPath:
>             prefixes = [re.sub("^(//[^/]+/).*", r'\1', prefixes[0])]
>
> @@ -1032,7 +1049,7 @@ class P4Sync(Command):
>             includeFile = True
>             for val in self.clientSpecDirs:
>                 if f['path'].startswith(val[0]):
> -                    if val[1] <= 0:
> +                    if val[1][0] <= 0:
>                         includeFile = False
>                     break
>
> @@ -1474,20 +1491,36 @@ class P4Sync(Command):
>         temp = {}
>         for entry in specList:
>             for k,v in entry.iteritems():
> +                if k.startswith("Client"):
> +                    self.clientName = v
> +
>                 if k.startswith("View"):
>                     if v.startswith('"'):
>                         start = 1
>                     else:
>                         start = 0
>                     index = v.find("...")
> +
> +                    # save the "client view"; i.e the RHS of the view
> +                    # line that tells the client where to put the
> +                    # files for this view.
> +                    cv = v[index+4:] # +4 to remove previous '... '

This feels less robust than what we might want. Isn't the format of a client-spec line either:

-?//depot/path[/...]\s+//client/path[/...]\n
or
-?"//depot/path with spaces/path[/...]"\s+"//client/path with spaces/path[/...]"

.. where -? means an optional '-' char, and \s+ is 'whatever-length-and-kind-of-whitespace'. I'm just guessing from memory regarding these patterns, but assuming that the section separator is exactly the string '... ' seems risky, no? :)

> +                    cv_index = cv.find("...")
> +                    cv=cv[:cv_index]
What if a line doesn't end with "..." ? Maybe add an "if cv_index >= 0"
Show 37 quoted lines
> +
> +                    # now save the view; +index means included, -index
> +                    # means it should be filtered out.
>                     v = v[start:index]
>                     if v.startswith("-"):
>                         v = v[1:]
> -                        temp[v] = -len(v)
> +                        include = -len(v)
>                     else:
> -                        temp[v] = len(v)
> +                        include = len(v)
> +
> +                    temp[v] = (include, cv)
> +
>         self.clientSpecDirs = temp.items()
> -        self.clientSpecDirs.sort( lambda x, y: abs( y[1] ) - abs( x[1] ) )
> +        self.clientSpecDirs.sort( lambda x, y: abs( y[1][0] ) - abs( x[1][0] ) )
>
>     def run(self, args):
>         self.depotPaths = []
> diff --git a/contrib/fast-import/git-p4.txt b/contrib/fast-import/git-p4.txt
> index 49b3359..e09da44 100644
> --- a/contrib/fast-import/git-p4.txt
> +++ b/contrib/fast-import/git-p4.txt
> @@ -191,6 +191,11 @@ git-p4.useclientspec
>
>   git config [--global] git-p4.useclientspec false
>
> +The P4CLIENT environment variable should be correctly set for p4 to be
> +able to find the relevant client.  This client spec will be used to
> +both filter the files cloned by git and set the directory layout as
> +specified in the client (this implies --keep-path style semantics).
> +
>  Implementation Details...
>  =========================
>
>
Aight. I need some sleep now. Nice work so far, Ian! :)
    -- Tor Arvid
Previous: Ian WienandNext: Ian Wienand
Message 4 of 7 in “Support different branch layouts in git-p4”
  1. Support different branch layouts in git-p4Ian Wienand, Feb 1, 2011
  2. Tor Arvid LundFeb 5, 2011
  3. Ian WienandFeb 7, 2011
  4. Tor Arvid LundFeb 7, 2011
  5. Ian WienandFeb 9, 2011
  6. Pete WyckoffFeb 10, 2011
  7. Pete WyckoffFeb 8, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.