Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Better experience for shallow repository #534

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Commits on Dec 4, 2021

  1. fix build error in a shallow-cloned source tree

    Cloning the repository with the --depth option is useful when you do
    not need the full git history, but it fails to build core/version.c
    
      $ git clone --depth 1 git://git.ipxe.org/ipxe.git
      $ cd ipxe/src
      $ make
       [snip]
          [VERSION] bin/version.ipxe.dsk.o
      In file included from include/ipxe/features.h:6,
                       from core/version.c:33:
      <command-line>: error: unsigned conversion from ‘int’ to ‘unsigned char’ changes value from ‘9062’ to ‘102’ [-Werror=overflow]
      include/ipxe/dhcp.h:529:58: note: in definition of macro ‘DHCP_OPTION’
        529 | #define DHCP_OPTION( ... ) VA_ARG_COUNT ( __VA_ARGS__ ), __VA_ARGS__
            |                                                          ^~~~~~~~~~~
        ...
    
    A shallow-cloned repository may not have any tag at all, then it returns
    only a commit hash.
    
      $ git describe --tags --always --long --abbrev=1 --match "v*"
      9062
    
    In such a case, VERSION_MINOR becomes empty, causing the build error.
    
    If 'git describe' does not find any tag, let the version macros fall
    back to the default:
    
      VERSION_MAJOR   = 1
      VERSION_MINOR   = 0
      VERSION_PATCH   = 0
      EXTRAVERSION    = +
    
    Setting sha1 to GITVERSION is still useful.
    
    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    masahir0y committed Dec 4, 2021
    Configuration menu
    Copy the full SHA
    37c2d10 View commit details
    Browse the repository at this point in the history
  2. take exactly 7 hex characters for GITVERSION

    git-describe(3) says:
    
      --abbrev=<n>
          Instead of using the default 7 hexadecimal digits as the
          abbreviated object name, use <n> digits, or as many digits
          as needed to form a unique object name. An <n> of 0 will
          suppress long format, only showing the closest tag.
    
    The number of "digits needed to form a unique object name" depends
    on your git repository, e.g. 1) how you cloned it, 2) how many local
    branches you have, etc.
    
    In the full cloned repository, --abbrev=1 for v1.21.1 gave me 5-digits
    as of writing (but it may increase in the future):
    
      $ git checkout v1.21.1
      $ git describe --tags --always --long --abbrev=1 --match 'v*'
      v1.21.1-0-g988d2
    
    In the repository cloned with --depth 1000, it is 4-digits.
    
      $ git clone --depth 1000 git://git.ipxe.org/ipxe.git
      $ ipxe
      $ git checkout v1.21.1
      $ git describe --tags --always --long --abbrev=1 --match 'v*'
      v1.21.1-0-g988d
    
    To make the version string deterministic, use --abbrev=32 and then
    take the first 7 characters, which is reasonable for this project.
    
    Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
    masahir0y committed Dec 4, 2021
    Configuration menu
    Copy the full SHA
    5f81075 View commit details
    Browse the repository at this point in the history