kitak/ohajiki

staged/unstaged changes are reset in offline environment

Opened this issue · 0 comments

Untaged/unstaged changes are reset in offline environment.

How to reproduce a bug ?

    1. Turnoff networking, (WiFi or LAN )
    1. Update any file in a target repository
    1. ohajiki start
    1. Lose all unstaged updates !

Here is snapshot of log

I, [2014-02-16T15:41:38.009628 #28551]  INFO -- : pull 
I, [2014-02-16T15:41:38.203328 #28551]  INFO -- : no changed
I, [2014-02-16T15:43:38.242448 #28551]  INFO -- : pull 
I, [2014-02-16T15:43:38.404432 #28551]  INFO -- : no changed
I, [2014-02-16T15:45:38.847586 #28551]  INFO -- : pull 
I, [2014-02-16T15:45:39.013210 #28551]  INFO -- : no changed
I, [2014-02-16T15:47:39.049478 #28551]  INFO -- : pull 
I, [2014-02-16T15:47:39.219531 #28551]  INFO -- : no changed

Where is bug ?

In an offline environment, git ls-remote origin HEAD returns empty string.

   def remote_head_id
      in_dir do
        h = @git.native('ls-remote', {}, 'origin', 'HEAD')
        h.empty? ? '' : h.split("\t")[0].strip
      end
    end

latest? returns false because remote_head_id is empty.

   def latest?
      remote_head_id == local_head_id
    end

Inside def sync in offline environment,

    1. @repo.lates?t return false
    1. @repo.reset_hard_head resets unstaged changes
    1. @repo.pull! will fail.
    def sync 
      unless @repo.latest?
        @log.info "pull #{@repo.remote_head_id}"
        @repo.reset_hard_head!
        @repo.pull!
      else
        @log.info "repository latest"
      end
    rescue => e 
      @log.error "sync: #{e.message}"
    end

英語で書いたけどしょぼい感あるので、一応日本語でも補足

  • オフラインだと git ls-remote が空文字を返してしまう
  • @repo.latest? が常に false になる
  • @repo.reset_hard_head! で変更が消えてしまう

というのを報告する issue です