# Buggy code
def get_unused_links(self, used):
    """Removes all saved links except the ones that are used.

    Args:
        used (list): list of used links that should not be removed.
    """
    unused = []

    self._execute(f"SELECT * FROM {self.LINK_STATE_TABLE}")
    for row in self.cursor:
        relpath, inode, mtime = row
        inode = self._from_sqlite(inode)
        path = os.path.join(self.root_dir, relpath)

        if path in used or not os.path.exists(path):
            continue

        actual_inode = get_inode(path)
        actual_mtime, _ = get_mtime_and_size(path, self.repo.tree)

        if (inode, mtime) == (actual_inode, actual_mtime):
            logger.debug("Removing '%s' as unused link.", path)
            unused.append(relpath)

    return unused


# Traceback (AssertionError)
$ dvc fetch -aT -v
2020-05-22 23:02:45,092 DEBUG: PRAGMA user_version;
2020-05-22 23:02:45,092 DEBUG: fetched: [(3,)]
2020-05-22 23:02:45,092 DEBUG: CREATE TABLE IF NOT EXISTS state (inode INTEGER PRIMARY KEY, mtime TEXT NOT NULL, size TEXT NOT NULL, md5 TEXT NOT NULL, timestamp TEXT NOT NULL)
2020-05-22 23:02:45,093 DEBUG: CREATE TABLE IF NOT EXISTS state_info (count INTEGER)
2020-05-22 23:02:45,093 DEBUG: CREATE TABLE IF NOT EXISTS link_state (path TEXT PRIMARY KEY, inode INTEGER NOT NULL, mtime TEXT NOT NULL)
2020-05-22 23:02:45,093 DEBUG: INSERT OR IGNORE INTO state_info (count) SELECT 0 WHERE NOT EXISTS (SELECT * FROM state_info)
2020-05-22 23:02:45,093 DEBUG: PRAGMA user_version = 3;
2020-05-22 23:02:45,117 DEBUG: Assuming '/home/hardik/src/example-get-started/.dvc/cache/42/c7025fc0edeb174069280d17add2d4.dir' is unchanged since it is read-only
2020-05-22 23:02:45,117 DEBUG: Assuming '/home/hardik/src/example-get-started/.dvc/cache/42/c7025fc0edeb174069280d17add2d4.dir' is unchanged since it is read-only
2020-05-22 23:02:45,117 DEBUG: Assuming '/home/hardik/src/example-get-started/.dvc/cache/68/36f797f3924fb46fcfd6b9f6aa6416.dir' is unchanged since it is read-only
2020-05-22 23:02:45,118 DEBUG: Assuming '/home/hardik/src/example-get-started/.dvc/cache/68/36f797f3924fb46fcfd6b9f6aa6416.dir' is unchanged since it is read-only
2020-05-22 23:02:45,184 DEBUG: SELECT count from state_info WHERE rowid=?
2020-05-22 23:02:45,184 DEBUG: fetched: [(7,)]
2020-05-22 23:02:45,184 DEBUG: UPDATE state_info SET count = ? WHERE rowid = ?
2020-05-22 23:02:45,197 ERROR: unexpected error
------------------------------------------------------------
Traceback (most recent call last):
File "/home/hardik/miniconda3/lib/python3.7/site-packages/dvc/main.py", line 49, in main
ret = cmd.run()
File "/home/hardik/miniconda3/lib/python3.7/site-packages/dvc/command/data_sync.py", line 75, in run
recursive=self.args.recursive,
File "/home/hardik/miniconda3/lib/python3.7/site-packages/dvc/repo/__init__.py", line 30, in wrapper
ret = f(repo, *args, **kwargs)
File "/home/hardik/miniconda3/lib/python3.7/site-packages/dvc/repo/__init__.py", line 536, in fetch
return self._fetch(*args, **kwargs)
File "/home/hardik/miniconda3/lib/python3.7/site-packages/dvc/repo/fetch.py", line 45, in _fetch
recursive=recursive,
File "/home/hardik/miniconda3/lib/python3.7/site-packages/dvc/repo/__init__.py", line 295, in used_cache
filter_info=filter_info,
File "/home/hardik/miniconda3/lib/python3.7/site-packages/dvc/stage/__init__.py", line 761, in get_used_cache
cache.update(out.get_used_cache(*args, **kwargs))
File "/home/hardik/miniconda3/lib/python3.7/site-packages/dvc/output/base.py", line 449, in get_used_cache
self.checksum, self._collect_used_dir_cache(**kwargs),
File "/home/hardik/miniconda3/lib/python3.7/site-packages/dvc/output/base.py", line 363, in _collect_used_dir_cache
if self.cache.changed_cache_file(self.checksum):
File "/home/hardik/miniconda3/lib/python3.7/site-packages/dvc/remote/base.py", line 805, in changed_cache_file
if self.is_protected(cache_info):
File "/home/hardik/miniconda3/lib/python3.7/site-packages/dvc/remote/local.py", line 719, in is_protected
if not self.exists(path_info):
File "/home/hardik/miniconda3/lib/python3.7/site-packages/dvc/remote/local.py", line 97, in exists
assert is_working_tree(self.repo.tree)
AssertionError
------------------------------------------------------------

Having any troubles? Hit us up at https://dvc.org/support, we are always happy to help!

# Fixed code
def get_unused_links(self, used):
    """Removes all saved links except the ones that are used.

    Args:
        used (list): list of used links that should not be removed.
    """
    unused = []

    self._execute(f"SELECT * FROM {self.LINK_STATE_TABLE}")
    for row in self.cursor:
        relpath, inode, mtime = row
        inode = self._from_sqlite(inode)
        path = os.path.join(self.root_dir, relpath)

        if path in used or not os.path.exists(path):
            continue

        actual_inode = get_inode(path)
        actual_mtime, _ = get_mtime_and_size(path, self.tree)

        if (inode, mtime) == (actual_inode, actual_mtime):
            logger.debug("Removing '%s' as unused link.", path)
            unused.append(relpath)

    return unused